home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / VideoFolder 1.0a / Source / FSSpecPane.cp < prev    next >
Text File  |  1996-06-21  |  2KB  |  84 lines

  1. #include "MoreFilesExtras.h"
  2. #include "FSSpecPane.h"
  3.  
  4. FSSpecPane* FSSpecPane::CreateFSSpecPaneStream ( LStream* inStream )
  5. {
  6.     return new FSSpecPane ( inStream );
  7. }
  8.  
  9. FSSpecPane::FSSpecPane ( LStream* inStream ) :
  10.     LCaption ( inStream )
  11. {
  12.     mSpec.vRefNum = 0;
  13.     mSpec.parID = 0;
  14.     mSpec.name[0] = 0;
  15. }
  16.  
  17. void FSSpecPane::DrawSelf ( )
  18. {    Rect frameRect;
  19.  
  20.     if ( CalcPortFrameRect ( frameRect ) )
  21.     {    
  22.         mText = "\p";
  23.         
  24.         Try_
  25.         {
  26.             long dirID;
  27.             Boolean isDirectory;
  28.             ThrowIfOSErr_ ( GetDirectoryID( mSpec.vRefNum, mSpec.parID, (StringPtr) mSpec.name, & dirID, & isDirectory ) );
  29.             
  30.             if ( ! isDirectory )
  31.                 mText = mSpec.name;
  32.  
  33.             Str255 volumeName;
  34.             short vRefNum;
  35.             long freeBytes;
  36.             ThrowIfOSErr_ ( GetVInfo ( mSpec.vRefNum, volumeName, & vRefNum, & freeBytes ) );
  37.             
  38.             if ( StringWidth ( mText ) + StringWidth ( volumeName ) + CharWidth ( ':' ) < frameRect.right - frameRect.left )
  39.             {
  40.                 mText.Insert ( ':', 1 );
  41.                 mText.Insert ( volumeName, 1 );
  42.             }
  43.  
  44.             unsigned char insertionPoint = mText.Length() + 1;
  45.  
  46.             FSSpec spec = mSpec;
  47.  
  48.             while ( spec.parID != 2 )
  49.             {
  50.                 if ( StringWidth ( mText ) < frameRect.right - frameRect.left )
  51.                 {
  52.                     ThrowIfOSErr_( FSMakeFSSpec ( spec.vRefNum, spec.parID, "\p", & spec ) );
  53.                 
  54.                     mText.Insert ( ':', insertionPoint );
  55.                     mText.Insert ( spec.name, insertionPoint );
  56.                 }
  57.                 else
  58.                 {
  59.                     mText.Insert ( "\p:…:", insertionPoint );
  60.                     break;
  61.                 }
  62.             }
  63.             
  64.         }
  65.         Catch_( inErr )
  66.         {
  67.             mText = "\p?";
  68.         }
  69.     }
  70.     
  71.     LCaption::DrawSelf ();
  72. }
  73.  
  74. void FSSpecPane::GetFSSpec( FSSpec& outSpec ) const
  75. {
  76.     outSpec = mSpec;
  77. }
  78.  
  79. void FSSpecPane::SetFSSpec( const FSSpec& inSpec )
  80. {
  81.     mSpec = inSpec;
  82.     Refresh();
  83. }
  84.